package empleados.clases.entidades;

import empleados.clases.componentes.Localidad;
import empleados.clases.localidades.DomicilioPrivado;

import java.sql.ResultSet;

public class Persona extends Entidad{

    private BaseDatos bd;

    private int id;
    private String nombre;
    private String apellidoPaterno;
    private String apellidoMaterno;
    private Localidad lugarDeNacimiento;
    private String fechaNacimiento;
    private boolean sexo;
    private EstadoCivil estadoCivil;
    private DomicilioPrivado domicilio;
    private DocumentoDeViaje[] documentos;

    public enum EstadoCivil{
        SOLTERO("Soltero"),
        CASADO("Casado"),
        DIVORCIADO("Divorciado"),
        VIUDO("Viudo"),
        OMITIDO("Omitido");

        private final String name;

        private EstadoCivil(String tipo){
            this.name = tipo;
        }

        public String getName(){
            return this.name;
        }

    }

    public Persona(){}

    public Persona(int id){
        ResultSet resultado;
        ResultSet resultadoDocumentos;
        int cntDocumentos = 0;
        bd = new BaseDatos("com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1:3306/terafit", "root", "");
        resultado = bd.obtenerDatos("SELECT * FROM persona AS p JOIN localidad AS l ON p.lugarDeNacimiento = l.id JOIN direccion AS d ON p.domicilio = d.id WHERE p.id = " + id);
        try{
            resultado.next();
            this.id = id;
            this.nombre = resultado.getString("nombre");
            this.apellidoPaterno = resultado.getString("apellidoPaterno");
            this.apellidoMaterno = resultado.getString("apellidoMaterno");
            this.lugarDeNacimiento = new Localidad(resultado.getInt("lugarDeNacimiento"));
            fechaNacimiento = resultado.getDate("fechaDeNacimiento").toString();
            this.sexo = resultado.getBoolean("sexo");
            this.estadoCivil = this.getEsadoCivil(resultado.getByte("estadoCivil"));
            this.domicilio = new DomicilioPrivado(resultado.getInt("domicilio"));
            resultadoDocumentos = bd.obtenerDatos("SELECT COUNT(*) FROM persona AS p JOIN documento_viaje AS dv ON dv.persona = p.id JOIN pais ON dv.id_pais = pais.id WHERE p.id = " + this.id);
            resultadoDocumentos.next();
            this.documentos = new DocumentoDeViaje[resultadoDocumentos.getInt(1)];
            resultadoDocumentos = bd.obtenerDatos("SELECT * FROM persona AS p JOIN documento_viaje AS dv ON dv.persona = p.id JOIN pais ON dv.id_pais = pais.id WHERE p.id = " + this.id);
            while(resultadoDocumentos.next()){
                this.documentos[cntDocumentos++] = new DocumentoDeViaje(resultadoDocumentos.getInt(10));
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    protected void setPersona(){
        
    }

    public EstadoCivil getEsadoCivil(byte estado){
        switch(estado){
            case 0:
                return EstadoCivil.SOLTERO;
            case 1:
                return EstadoCivil.CASADO;
            case 2:
                return EstadoCivil.DIVORCIADO;
            case 3:
                return EstadoCivil.VIUDO;
            default:
                return EstadoCivil.OMITIDO;
        }
    }

    public String getNombreCompleto(){
        return this.nombre + " " + this.apellidoMaterno + " " + this.apellidoPaterno;
    }

    public String getNombre(){
        return this.nombre;
    }

    public String getApellidoPaterno(){
        return this.apellidoPaterno;
    }

    public String getApellidoMaterno(){
        return this.apellidoMaterno;
    }

    public Localidad getLugarDeNacimiento(){
        return this.lugarDeNacimiento;
    }

    public String getFechaNacimiento(){
        return this.fechaNacimiento;
    }

    public String getSexo(){
        return this.sexo ? "Masculino" : "Femenino";
    }

    public String getEstadoCivil(){
        return this.estadoCivil.getName();
    }

    public DomicilioPrivado getDomicilio(){
        return this.domicilio;
    }

    public String getDocumentos(){
        String resultado = "";
        for(DocumentoDeViaje documento : documentos) resultado += documento.getValoresDocumento() + "\n";
        return resultado;
    }

}